<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="a5Y3C" id="a5Y3C"><span data-lake-id="u7940b79a" id="u7940b79a">典型回答</span></h1>
  <p data-lake-id="ue49e0667" id="ue49e0667"><br></p>
  <p data-lake-id="ubfa759c9" id="ubfa759c9"><br></p>
  <p data-lake-id="u51ad2740" id="u51ad2740"><span data-lake-id="u415bda2a" id="u415bda2a">我们知道，当MySQL中的单表数据量很大以后，一般就要考虑做分库分表了，主要原因就是单表量太大会导致查询效率下降。</span></p>
  <p data-lake-id="u484e3532" id="u484e3532"><span data-lake-id="ub211aa8f" id="ub211aa8f">​</span><br></p>
  <p data-lake-id="u4b2dbac8" id="u4b2dbac8"><span data-lake-id="u9ff45bd2" id="u9ff45bd2">但是，因为分库分表其实不仅实现方案复杂，并且也会带来很多问题，比如跨库事务、分页查询等，</span><strong><span data-lake-id="u6cd2596e" id="u6cd2596e">不到万不得已，不建议大家直接做分库分表。</span></strong></p>
  <p data-lake-id="u388888b0" id="u388888b0"><span data-lake-id="ua1b04499" id="ua1b04499">​</span><br></p>
  <p data-lake-id="u5dc70b17" id="u5dc70b17"><br></p>
  <p data-lake-id="uded8bc94" id="uded8bc94"><span data-lake-id="u56065e7a" id="u56065e7a">在分库分表前应该先考虑其他的方案。以及分表的必要性。</span></p>
  <p data-lake-id="uc517162e" id="uc517162e"><span data-lake-id="u26334f93" id="u26334f93">​</span><br></p>
  <p data-lake-id="u83eaf26e" id="u83eaf26e"><span data-lake-id="ucf5e0709" id="ucf5e0709">一般来说，我们做分库的目的是提升数据库的吞吐量，做分表的目的是提升查询的效率。那么，当数据量大的时候，也可以用其他的方案来解决，应该优先考虑以下几个方案：</span></p>
  <p data-lake-id="u59e8bcae" id="u59e8bcae"><span data-lake-id="uea758c04" id="uea758c04">​</span><br></p>
  <p data-lake-id="u916d2cb9" id="u916d2cb9"><strong><span data-lake-id="u9470a71d" id="u9470a71d">1、数据库优化</span></strong></p>
  <p data-lake-id="u33ef56df" id="u33ef56df"><span data-lake-id="ue2d3b681" id="ue2d3b681">​</span><br></p>
  <p data-lake-id="u99ee57fe" id="u99ee57fe"><span data-lake-id="u6ff40e4e" id="u6ff40e4e">比如说，2000万的数据量，其实大多数情况下用好索引就可以提升很大的效率的，有的时候把索引优化好，表结构设计好（比如适当做数据冗余），SQL语句（比如减少多表JOIN）优化好，就可以大大提升性能。</span></p>
  <p data-lake-id="ue1b89901" id="ue1b89901"><span data-lake-id="ud6b600ab" id="ud6b600ab">​</span><br></p>
  <p data-lake-id="ubc404548" id="ubc404548"><strong><span data-lake-id="u7dc477ec" id="u7dc477ec">2、缓存</span></strong></p>
  <p data-lake-id="u51585bfc" id="u51585bfc"><span data-lake-id="uc8d27e95" id="uc8d27e95">​</span><br></p>
  <p data-lake-id="u555c2294" id="u555c2294"><span data-lake-id="u786bdc61" id="u786bdc61">减少对数据库的压力可以通过缓存来实现，不要把所有的流量都交给数据库来抗。适当的在近端做一些缓存，如本地缓存、分布式缓存等就可以快速的返回，还能减少数据库的压力。</span></p>
  <p data-lake-id="u445713ac" id="u445713ac"><span data-lake-id="u4087c341" id="u4087c341">​</span><br></p>
  <p data-lake-id="uddd77f38" id="uddd77f38"><strong><span data-lake-id="u226c6463" id="u226c6463">3、分区</span></strong></p>
  <p data-lake-id="u4f926941" id="u4f926941"><span data-lake-id="ubbc4a75e" id="ubbc4a75e">​</span><br></p>
  <p data-lake-id="u7c0e26a4" id="u7c0e26a4"><span data-lake-id="ufecfb8f2" id="ufecfb8f2">通过数据分区可以减小单个表的物理存储空间，数据分区后，存储在不同的表或文件中，以减小单表的数据量，可以提高查询性能。</span></p>
  <p data-lake-id="u0e0168b6" id="u0e0168b6"><span data-lake-id="uc580c140" id="uc580c140">​</span><br></p>
  <p data-lake-id="u783debf2" id="u783debf2"><strong><span data-lake-id="u3395e19a" id="u3395e19a">4、数据归档</span></strong></p>
  <p data-lake-id="udaf8c083" id="udaf8c083"><span data-lake-id="uf33d2674" id="uf33d2674">​</span><br></p>
  <p data-lake-id="u2737521f" id="u2737521f"><span data-lake-id="uc37f05aa" id="uc37f05aa">我们可以定期的清理一些不再需要，或者不再活跃的数据，把他们进行数据归档到辅助存储中（如历史表，离线数仓等），这样就可以减少数据的数量，就能大大提升效率。</span></p>
  <p data-lake-id="u2662b1a8" id="u2662b1a8"><span data-lake-id="u2cf48e39" id="u2cf48e39">​</span><br></p>
  <p data-lake-id="u011024f0" id="u011024f0"><strong><span data-lake-id="u29da911b" id="u29da911b">5、分布式数据库</span></strong></p>
  <p data-lake-id="u5cac0cf5" id="u5cac0cf5"><br></p>
  <p data-lake-id="u79209c1b" id="u79209c1b"><span data-lake-id="ubb1d35d0" id="ubb1d35d0">另外，也可以考虑采用分布式数据库系统，这样可以在多个节点上分散数据，提高性能和容量。虽然分布式数据库需要的成本比较高，但是相比分库分表的改造来说，受益也比较大。</span></p>
 </body>
</html>